package com.lovo.pis.utils;

import cn.afterturn.easypoi.excel.annotation.Excel;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * 解析我们Excel表中数据，并将Excel中的数据和java的属性进行匹配或赋值
 */
public class ExcelImport {
    //返回List<Object>类型的数据
    /**
     *
     * @param file  二进制文件
     * @param
     * @return
     * @throws Exception
     */
    public static List<Object> importExcel(MultipartFile file, Class cls) throws Exception {
        //上传文件路径 F:\\Program Files\\java\\chaozexu\\bdks\\demo\\upload\\
//        String filePath = NiuaConfig.getUploadPath();
        //上传文件并返回新文件名称
//        String fileName = FileUploadUtils.upload(filePath, file);
        //拼接文件上传到服务器的绝对路径
//        fileName = filePath + File.separator + fileName;

        String pathName =  FileUtil.getFilePathName(file);
        //把上传的文件转换成输入流
        FileInputStream fileInputStream = new FileInputStream(new File(pathName));
        //输入流 和 文件路径  作为参数传入 获取List<List<Object>>类型数据的方法中
        List<List<Object>> list = ExcelUtils.getListByExcel(fileInputStream,pathName);
        //将数据转换成List<Object>类型的数据
        List<Object> firstRows = null;
        //将第一行拿出
        if (list != null && list.size() > 0) {
            firstRows = list.get(0);
        }
        //创建excelDate集合,将需要插入数据库的数据放到excelDate中
        List<Object> excelDate = new ArrayList<>();
        //遍历每行数据
        for (int i = 1; i < list.size(); i++) {
            List<Object> rows = list.get(i);
            //通过反射实例化处理的类
            Object obj = cls.newInstance();
            //对每行的每列进行遍历
            for (int j = 0; j < rows.size(); j++) {
                String cellVal = (String) rows.get(j);
                //调用方法给实体类属性赋值
                ExcelImport.setFieldValueByFieldName(obj, firstRows.get(j).toString().trim(), cellVal);
            }
            excelDate.add(obj);
        }
        return excelDate;
    }


    /**
     * 通过反射判断注解和属性名并给实体类赋值
     * 将获取的数据的数据类型，转化为实体类属性类型
     * @param object
     * @param fieldName
     * @param val
     */
    public static void setFieldValueByFieldName(Object object, String fieldName, Object val) {
        try {
            //通过反射获取类中属性
            Field[] fields = object.getClass().getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                //反射对属性进行赋值
                //强制类型转换
                field.setAccessible(true);
                //拿到当前实体类字段的Excel注解
                Excel excel = field.getAnnotation(Excel.class);
                if(excel == null){
                    continue;
                }
                if(fieldName.equals(excel.name())||fieldName.equals(field.getName())){
                    //把属性值set进对象
                    //将String类型强转换为其实体类相对应的类型
                    if(field.getType()==Integer.class){
                        field.set(object,Integer.valueOf(val.toString()));
                    } else if(field.getType()==Long.class){
                        field.set(object,Long.valueOf(val.toString()));
                    }else if(field.getType()== LocalDateTime.class){
                        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                        LocalDateTime LocalTime = LocalDateTime.parse( val.toString(),df);
                        field.set(object,LocalTime);
                    }else
                        field.set(object, val);
                    return;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

